/*
 * MyProperties.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 05/05/2009, 11:23:38 AM
 */

package com.ufps.cuatro.util.opciones;

import com.ufps.cuatro.controlador.render.UtilRender;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>MyProperties:</b></i> Implementa el Soporte de Archivos Propierties
 * utilizados para contener la información de las descripciones de Controles,
 * eventos y configuraciones generales en la aplicación.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 05/05/2009
 * @see Properties
 */
public class MyProperties extends Properties{
    private static final long serialVersionUID = 4293520040640079376L;
    
    private ArrayList<String> objKey;
    private ArrayList<String> objValue;

    /**
     * Constructor por defecto
     */
    public MyProperties() {
        super();
    }

    /**
     * @DefinicionMetodo
     * @param strPath @DefinicionParametro
     * @throws FileNotFoundException @DefinicionExcepcion
     * @throws IOException @DefinicionExcepcion
     */
    public MyProperties(String strPath) throws FileNotFoundException, IOException {
        File objFile = new File(strPath);
        if(objFile.exists()){
            super.load(new FileInputStream(objFile));
            identificar();
        }
    }

    /**
     * @DefinicionMetodo
     * @param objPath @throws IOException 
     * @DefinicionParametro
@DefinicionExcepcion
     */
    public MyProperties(URI objPath) throws IOException {
        File objFile = new File(objPath);
        if(objFile.exists()){
            super.load(new FileInputStream(objFile));
            identificar();
        }
    }
    
    /**
     * 
     * @param in
     * @throws IOException
     */
    public MyProperties(InputStream in) throws IOException {        
        super.load(in);
        identificar();        
    }

    /**
     * @DefinicionMetodo
     * @param objFile @DefinicionParametro
     * @throws FileNotFoundException @DefinicionExcepcion
     * @throws IOException @DefinicionExcepcion
     */
    public MyProperties(File objFile) throws FileNotFoundException, IOException {
        if(objFile.exists()){
            super.load(new FileInputStream(objFile));
            identificar();
        }
    }

    /**
     * @DefinicionMetodo
     * @param value @DefinicionParametro
     * @return @DefinicionReturn
     */
    public String getKey(String value){
        if(this.containsValue(value)){
            for(Enumeration e = this.keys(); e.hasMoreElements();){
                String key = (String) e.nextElement();
                if(this.getProperty(key).equals(value))
                    return key;
            }
        }
        return null;
    }

    @Override
    public String getProperty(String key) {
        if(this.containsKey(key))
            return super.getProperty(key);
        System.out.print("error" + " " + key);
        return null;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public ArrayList<String> getObjKey() {
        return objKey;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public ArrayList<String> getObjValue() {
        return objValue;
    }

    /**
     * 
     */
    public final void identificar(){
        Enumeration eKeys = this.keys();
        this.objKey = new ArrayList<String>();
        this.objValue = new ArrayList<String>();
        while(eKeys.hasMoreElements()){
            String strKey = (String) eKeys.nextElement();
            this.objKey.add(strKey);
            this.objValue.add(this.getProperty(strKey));
        }
    }    
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
@DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String> getPropertiesList(String key){
        ArrayList<String> values = new ArrayList<String>();        
        int i = 0;
        while(this.containsKey(key + "[" + i + "]")){
            String tempKey = key + "[" + i + "]";            
            if(this.containsKey(tempKey)) {
                String tempValue = this.getProperty(tempKey);
                values.add(tempValue);
            }            
            i++;
        }
        return values;
    }
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
     * @param tokens @DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String[]> getPropertiesList(String key, String tokens){
//     if(tokens != null){
        ArrayList<String[]> values = new ArrayList<String[]>();
        try{        
            StringTokenizer objTokens = new StringTokenizer(tokens, " ,");        
            int i = 0;
            int size = objTokens.countTokens();
            String[] keys = new String[size];
            while(objTokens.hasMoreTokens()) {
                keys[i++] = objTokens.nextToken();
            }
            i = 0;
            while(this.containsKey(key + "[" + i + "]." + keys[0])){
                String[] grupo = new String[size];
                for(int j = 0; j < size; j++){
                    String tempKey = key + "[" + i + "]." + keys[j];
                    if(this.containsKey(tempKey)) {
                        grupo[j] = this.getProperty(tempKey);
                    }
                }
                values.add(grupo);
                i++;
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(MyProperties.class.getName()).log(Level.SEVERE, null, ex);
        }
        return values;
//    }else{
//            UtilRender.printlnConsole("token Nulo.", UtilRender.ACTION_NORMAL, false);            
//        }
//     return null;
    }
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
     * @param tokens @DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String[]> getPropertiesListOnlyOne(String key, String tokens){
        ArrayList<String[]> values = new ArrayList<String[]>();
        
        try{
            StringTokenizer objTokens = new StringTokenizer(tokens, " ,");
            int size = objTokens.countTokens();
            String[] keys = new String[size];
            for(int i = 0; objTokens.hasMoreTokens(); i++) {
                keys[i] = objTokens.nextToken();
            }

            if(this.containsKey(key + "." + keys[0])){
                String[] grupo = new String[size];
                for(int j = 0; j < size; j++){
                    String tempKey = key + "." + keys[j];
                    if(this.containsKey(tempKey)) {
                        grupo[j] = this.getProperty(tempKey);
                    }
                }
                values.add(grupo);            
            }
        }catch(java.lang.Exception ex){}
        return values;
    }    
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
     * @param keyTokens @DefinicionParametro
     * @param strIdsTokens @DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String[]> getPropertiesList(String key, String keyTokens, String strIdsTokens){
        ArrayList<String[]> values = new ArrayList<String[]>();
        StringTokenizer objTokens = new StringTokenizer(keyTokens, " ,");
        int i = 0;
        int size = objTokens.countTokens();
        String[] keys = new String[size];
        while(objTokens.hasMoreTokens())
            keys[i++] = objTokens.nextToken();

        objTokens = new StringTokenizer(strIdsTokens, " ,");
        while(objTokens.hasMoreTokens()){
            i = Integer.parseInt(objTokens.nextToken());
            if(this.containsKey(key + "[" + i + "]." + keys[0])){
                String[] grupo = new String[size];
                for(int j = 0; j < size; j++){
                    String tempKey = key + "[" + i + "]." + keys[j];
                    if(this.containsKey(tempKey))
                        grupo[j] = this.getProperty(tempKey);
                }
                values.add(grupo);
            }
        }
        return values;
    }  
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
@DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String> getValuesProperties(String key){
        String values = getProperty(key);
        return getValuesPropertiesToken(values, " ,");
    }
    
    /**
     * @DefinicionMetodo
     * @param values 
@DefinicionParametro
     * @param tokens @DefinicionParametro
     * @return @DefinicionReturn
     */
    public ArrayList<String> getValuesPropertiesToken(String values, String tokens){        
        try{
            ArrayList<String> objvalues = new ArrayList<String>();        
            StringTokenizer objTokens = new StringTokenizer(values, tokens);        

            while(objTokens.hasMoreTokens()) {
                objvalues.add(objTokens.nextToken());
            }        
            return objvalues;
        } catch (java.lang.NullPointerException ex){}
        return null;
    }
    
    
}
